#ifndef GRAPH_H
#define GRAPH_H

#include "common.h"


/**
	Wierzcholek grafu
*/
typedef struct {
   int      numConns;		// liczba polaczen wychodzacych
   int*     conns;				// polaczenia wychodzace
   double*  connDists;		// odleglosci polaczen wychodzacych
} Node;


/**
	Graf skierowany, wazony
*/
typedef struct {
   int      numNodes;		// liczba wierzcholkow
   double*  dists;			// odleglosci wierzcholkow od zrodla - przydatne w obliczeniach na grafie
   int*     prev;				// lista poprzednikow dla wierzcholkow - przydatne w liczeniu EMST
   Node* nodes;				// wierzcholki grafu
} Graph;


/**
	Wysyla graf do innych jednostek obliczeniowych jesli rank == 0 lub odbiera go od procesu glownego
*/
void     broadcastGraph(Graph* graph, int rank, int numProc);

/**
	Wypisuje odleglosci oraz sciezki w grafie wychodzace ze zrodla, biegnace do kazdego wierzcholka
*/
void     printGraph(Graph graph);

/**
	Wypisuje polaczenia grafu
*/
void     printGraphConns(Graph graph);

/**
	J.w. ale do pliku
*/
int		 printGraphConnsModToFile(Graph graph, char* fileName);


/**
	Sprawdza czy wierzcholek o indeksie 'i' ma polaczenie wychodzace z wierzcholkiem o indeksie 'j' w grafie
*/
bool		alreadyConnected(Graph graph, int i, int j);


/**
	Dodaje wierzcholek o indeksie 'to' do listy polaczen wezla grafu. Ustawia odleglosc polaczenia na 'dist'
*/
void		graphNodeConnect(Node* node, int to, double dist);


/**
	Tworzy z grafu drzewo wykorzystujac pole 'prev' dla kazdego wierzcholka.
	Pozwala na stworzenie drzewa MST po wykonaniu algorytmu Prim'a na grafie.
*/
void     graphToTreeFromPrevList(Graph graph);


/**
	Wyrzuca z grafu polaczenia do wezlow o indeksach nie bedacych w przedziale [startNode, endNode)
*/
void     reduceGraph(Graph graph, int startNode, int endNode);


#endif  // GRAPH_H
